/**
 * Copyright  2025, Hai Yue Xing He Technology Co., Ltd
 * 
 * @author        ZHAO LIMIN
 * @version       1.0.1
 * @since         2025-04
 * HYXHGeo.ts     是基础图元，用来描述游戏的基础矢量图结构，并进行和cc.Primitive进行映射
 *                在gdata 进行处理。 
 *                游戏设计中，根据cocos creater 中，对场景Secene 进行设计和制作，然后进行
 *                分析后， 生成对应Sence的矢量描述， 然后生成对应GData 数据， 引擎驱动下，进行
 *                各种状态的渲染。 GData（JSON 格式） 就进行渲染的方案配置。
 *                满足设计完，及可以开始游戏。
 * 
 *                在设计中，增加一个Design 按钮，在发布时候，Design 按钮屏蔽掉。
 */
import {ICartesian} from "./Cartesian";             // 坐标信息
import { Cartesian3 } from "./Cartesian3";
import { Check } from "./Check";
import { UNION_NUMBER_ARRAY } from "./HDataType";

/**
 * 将指定开始和结束点的线段，按照指定断落数，进行分割，返回分割点的数组
 * @param start             开始点坐标
 * @param end               结束点坐标
 * @param segmentCount      分割数
 * @param segmentCount 
 * @returns 
 */
export function GetSegmentPoints(start: ICartesian, end: ICartesian, segmentCount: number): Array<ICartesian> {
    let points = new Array<ICartesian>();
    if (segmentCount < 2) {
        return points;
    }
    let dx = (end.x - start.x) / segmentCount;
    let dy = (end.y - start.y) / segmentCount;
    let dz = (end.z - start.z) / segmentCount;
    for (let i = 1; i < segmentCount; i++) {
        let _x = start.x + dx * i;
        let _y = start.y + dy * i;
        let _z = start.z + dz * i;
        points.push(new Cartesian3(
                        Math.floor(_x),
                        Math.floor(_y),
                        Math.floor(_z))); 
    }
    return points;
}
/**
 * 获得距离指定点的指定距离的点
 * @param start 
 * @param end 
 * @param distance 
 * @returns 
 */
export function GetPointForDistance(start: ICartesian, end: ICartesian, distance: number): ICartesian {
    let dx = end.x - start.x;
    let dy = end.y - start.y;
    let dz = end.z - start.z; 
    let len = Math.sqrt(dx * dx + dy * dy + dz * dz);
    let _x = start.x + dx * distance / len;
    let _y = start.y + dy * distance / len;
    let _z = start.z + dz * distance / len;
    return {x: _x, y: _y, z:_z};
}

export function GetSplitPointsForDistance(start: ICartesian, end: ICartesian, distance: number): Array<ICartesian>{
    Check.defined("distance", distance);
    Check.defined("start", start);
    Check.defined("end", end);
    if ( distance <= 0) {
        return []; 
    }
    let dx = end.x - start.x;
    let dy = end.y - start.y;
    let dz = end.z - start.z; 
    let len = Math.sqrt(dx * dx + dy * dy + dz * dz);
    let segmentCount = Math.floor(len / distance);
    if (segmentCount <= 1) {
        return [];
    }
    return GetSegmentPoints(start, end, segmentCount);
    
}